package com.cskaoyan.javase._2inner._5anonymous._2usecase;

import com.sun.deploy.util.SyncAccess;

/**
 * 匿名内部类在开发中,基本取代了局部内部类的使用场景
 *      因为作用是一样的,但匿名内部类语法更简洁.
 *
 * 匿名内部类经常使用在以下两个场景中：
 * 1.方法需要返回一个对象，返回值类型是引用数据类型时。
 *      方法需要返回一个对象时，可以在方法的局部位置写一个 基于X类或X接口的匿名内部类对象 ，然后直接作为返回值返回给外界。
 *
 * 2.方法需要传入一个对象，形参数据类型是引用数据类型时。
 *      方法需要传入一个对象实参时，可以在调用方法的实参位置填入一个 基于X类或X接口的匿名内部类对象，就将它作为一个实参传给方法使用。
 *
 * 使用匿名内部类的优点：
 *      1.绝对对外界隐藏，封装。
 *      2.比起局部内部类，它更方便简洁了。
 *          所以实际开发中，匿名内部类基本取代了局部内部类的作用。
 * 缺点：
 * 这个对象是一次性的。
 *
 * @since 10:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(new A());
        class ASon extends A {
            @Override
            void test() {
                System.out.println("我是局部内部类的实现!");
            }
        }
        test(new ASon());

        test(new A() {
            @Override
            void test() {
                System.out.println("我是匿名内部类的实现,我比你高级!");
            }
        });


        // 抽象类的子类对象
        BaseA ba = test();
        ba.test();
    }

    public static void test(A a) {
        a.test();
    }

    public static BaseA test() {
        return new BaseA() {
            @Override
            public void test() {
                System.out.println("我是匿名内部类实现的抽象类的子类对象!");
            }
        };
    }
}

class A {
    void test() {
        System.out.println("A");
    }
}

abstract class BaseA {
    public abstract void test();
}

interface IA {
    void test();
}
